package br.ufrj.dcc.ad.systems;

import java.util.Collection;

import br.ufrj.dcc.ad.generators.TimeGenerator;

public abstract class Fila{
	
	/** Coleção de clientes. */
	protected Collection<Cliente> clientes;
	/** Gerador de servico da fila. */
	protected TimeGenerator geradorServico;
	
	public Fila(TimeGenerator geradorServico){
		this.geradorServico = geradorServico;
	}

	/** Adiciona um novo cliente. */
	public abstract void add(Cliente cliente);
	/** Remove o cliente. */
	public abstract void remove(Cliente cliente);
	/** Coloca o cliente na posição mais prioritária da fila. */
	public abstract void reenter(Cliente cliente);
	/** Coloca o cliente de volta na fila após ocorrer uma interrupção. */
	public abstract void interruptReenter(Cliente cliente);
	/** Pega o próximo cliente da fila e o remove da mesma. */
	public abstract Cliente getAndRemoveNext();
	/** Pega o próximo cliente da fila sem removê-lo. */
	public abstract Cliente seeNext();
	/** Retorna o cliente menos prioritário dentre os dois fornecidos. */
	public abstract Cliente lessPriority(Cliente cliente1, Cliente cliente2);
	
	/** Retorna o número de clientes na fila */
	public int size() {
		return this.clientes.size();
	}
	/** Diz se a lista está vazia. */
	public boolean isEmpty(){
		return clientes.isEmpty();
	}
	/** Limpa a fila. */
	public void clear(){
		clientes.clear();
	}
	
	public TimeGenerator getGeradorServico() {
		return geradorServico;
	}

	public void setGeradorServico(TimeGenerator geradorServico) {
		this.geradorServico = geradorServico;
	}

	public void resetGeradorServico() {
		geradorServico.resetSeed();
	}
}
